package com.echo.im.repository.offline;


import java.util.List;

/**
 * 离线消息管理接口
 * @author echo
 */
public interface OfflineMessageService<T> {

    /**
     * 使用说明
     * 1. userId代表当前用户，uuid代表当前会话，如果userId没有被上锁，则获取锁，如果上锁了，验证是否是同一会话
     * 2. uuid代表当前会话，建议提供接口给前端生成，后期在同一个离线操作流程中，需携带此uuid证明是同一会话，便于锁重入
     * 3. 如果是第一次调用，肯定就无法传入lastMsgId，这个值是用来进行增量获取并且删除MsyId小于lastMsgId的离线消息
     * 4. 当获取到的消息为空，则表示没有离线消息，并且已经获取的消息已经全部ack完毕了，可以释放分布式锁了
     * @param userId
     * @param lastMsgId
     * @param size
     * @param uuid
     * @return
     */
    List<T> fetchAndDeleteOfflineMessages(Long userId, Long lastMsgId, int size, String uuid);

    /**
     * 为指定用户添加离线消息
     * 该方法主要用于在用户离线时，存储或记录其未读消息的ID，以便用户上线后可以获取到这些消息
     *
     * @param userId 用户的唯一标识符，用于确定消息接收者
     * @param msgId 消息的唯一标识符，用于标识和存储离线消息
     */
    void addOfflineMessage(Long userId,  Long msgId);

    /**
     * 根据给定的代码值判断当前功能是否支持
     * 此方法用于检查特定功能是否根据提供的代码值可用，以确保系统的兼容性和功能的正确调用
     *
     * @param code 功能代码，用于标识和匹配特定的功能或操作
     * @return 返回一个布尔值，表示是否支持指定的功能
     */
    boolean support(Integer code);

    /**
     * 获取离线消息数量
     * @param userId 用户Id
     * @return 离线消息数量
     */
    Long getOfflineMessageCount(Long userId);
}
